<?php

/**
 * 后台网站设置model操作
 * @author  xiaobai
 * @date    2017-01-12
 */

namespace app\common\model;

use app\common\model\Common;

class AccessToken extends Common
{
    protected $pk                 = 'id';
    protected $autoWriteTimestamp = 'datetime'; // 自动写入时间，格式为Y-m-d H:i:s

    /**
     * 保存access_token数据，存在则更新
     * @param  string $provider    第三方平台参数
     * @param  array  $app_account 第三方平台应用账户信息
     * @param  array  $token_data  第三方平台返回token信息
     * @return array
     */
    public function saveAccessTokenData($provider = '', $app_account = [], $token_data = [])
    {
        $last_row = $this->getOneAccessToken($provider, $app_account);
        if (!empty($last_row) && $last_row['access_token'] == $token_data['access_token']) {
            $res = $this->updateAccountTokenById($last_row['id'], $token_data);
        } else {
            $res = $this->addAccessTokenData($provider, $app_account, $token_data);
        }

        if ($res === false) {
            return ['code'=>1, 'msg'=>'保存access_token失败'];
        }
        return ['code'=>0];
    }

    /**
     * 获取一条access_token数据
     * @param  string $provider    第三方平台参数
     * @param  array  $app_account 第三方平台应用账户信息
     * @return array|void
     */
    public function getOneAccessToken($provider = '', $app_account = [], $order = 'id desc')
    {
        $now_time = time();
        $where[] = ['provider', '=', $provider];
        $where[] = ['app_key', '=', $app_account['app_key']];
        $where[] = ['expires_time', '>', $now_time];

        $row = $this->where($where)->order($order)->find();

        return $row;
    }

    /**
     * 保存access_token数据
     * @param string $provider    第三方平台参数
     * @param array  $app_account 第三方平台应用账户信息
     * @param array  $token_data  第三方平台返回token信息
     * @return array|void|bool
     */
    public function addAccessTokenData($provider = '', $app_account = [], $token_data = [])
    {
        $now_time = time();
        $data     = [
            'provider'     => $provider,
            'app_key'      => $app_account['app_key'],
            'access_token' => $token_data['access_token'],
            'expires_in'   => $token_data['expires_in'],
            'expires_time' => $token_data['expires_in'] + $now_time,
        ];
        switch ($provider) {
            case 'weibo':
                $data['openid'] = $token_data['uid'];
                break;
            case 'qq':
                $data['openid'] = $token_data['openid'];
                break;
        }

        return $this->save($data);
    }

    /**
     * 更新access_token有效时间数据
     * @param  integer $token_id   token id值
     * @param  array   $token_data 第三方平台返回token信息
     * @return array|void|bool
     */
    public function updateAccountTokenById($token_id = 0, $token_data = [])
    {
        $now_time    = time();
        $where['id'] = $token_id;
        $data = [
            'expires_in'   => $token_data['expires_in'],
            'expires_time' => $token_data['expires_in'] + $now_time,
        ];

        return $this->save($data, $where);
    }

}
